# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/28 14:46 
@Author  : ZhangShenao 
@File    : lambda.py 
@Desc    : Lambda表达式
在Python中,可以通过Lambda表达式来便捷地定义一个功能简单的函数,这个函数只有实现没有名字,所以也叫作匿名函数
Lambda表达式语法:
lambda 参数1, 参数2, 参数N: 函数实现

通常情况下,不会直接用lambda表达式来定义函数,更多是在函数传参时使用Lambda表达式来简化操作
"""

# 通过Lambda表达式定义一个函数,实现一个数的平方
square = lambda x: x ** 2  # square变量保存的是一个函数,它的类型是function
# type of square is: <class 'function'>, value is: <function <lambda> at 0x104eada80>
print(f'type of square is: {type(square)}, value is: {square}')
print(square(2))  # 4
print(square(9))  # 81


# 通常情况下,不会直接用lambda表达式来定义函数,更多是在函数传参时使用Lambda表达式来简化操作

def filter_nums(nums: list, nums_filter) -> list:
    """
    对list中的元素进行过滤,返回满足条件的值
    :param nums: 原始数据list
    :param nums_filter: 过滤器
    :return:  过滤后的list
    """

    return [n for n in nums if nums_filter(n)]  # list生成式


# 调用filter_nums,使用Lambda表达式来简化传参
odd_nums = filter_nums([n for n in range(0, 21)], lambda x: x % 2 == 1)
print(odd_nums)  # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19])

# 调用sorted()函数进行排序时,也可通过Lambda表达式来指定排序策略
area_code = {
    '北京': '010',
    '上海': '021',
    '沈阳': '024',
    '广州': '020',
}

# 按照value降序排序
sorted_area_code = sorted(area_code.items(), key=lambda kv: kv[1], reverse=True)
print(sorted_area_code)  # [('沈阳', '024'), ('上海', '021'), ('广州', '020'), ('北京', '010')])
